package edu.uoc.tds.pec4.gestor.impl;

import edu.uoc.tds.pec4.gestor.GestorInformes;
import edu.uoc.tds.pec4.model.SS1_CentroDocente;
import edu.uoc.tds.pec4.model.SS1_TipoEvento;
import edu.uoc.tds.pec4.model.SS1_Universidad;
import edu.uoc.tds.pec4.model.SS1_Usuario;
import edu.uoc.tds.pec4.model.SS2_Evento;
import edu.uoc.tds.pec4.model.SS3_InformeEventosAsistente;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.KeyValue;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Clase que implementa los servicios pedidos desde el cliente
 * @author José Carlos Fernández Luque
 * @version 1.0
 */
@SuppressWarnings("deprecation")
public class GestorInformesImpl extends GestorDiscoImpl implements GestorInformes, Serializable {

    /**
     *
     * @throws RemoteException
     */
    public GestorInformesImpl() throws RemoteException {
        super();
    }

    public List<SS1_Usuario> dameListaAsistentes() throws RemoteException, Exception {
        List<SS1_Usuario> lista = new ArrayList<SS1_Usuario>();
        ResultSet rs = null;
        try {
            conectaBD();
            String query = "SELECT usuario.nombre, usuario.apellido1, usuario.apellido2,"
                    + " usuario.cod_usuario "
                    + "FROM public.inscripcion, public.usuario "
                    + "WHERE inscripcion.cod_usuario = usuario.cod_usuario "
                    + "AND inscripcion.checkin = true;";
            rs = selectQuery(query);
            while (rs.next()) {
                SS1_Usuario SS1_Usuario = new SS1_Usuario();
                SS1_Usuario.setCodigo(rs.getString("cod_usuario"));
                SS1_Usuario.setNombre(rs.getString("nombre"));
                SS1_Usuario.setApellido1(rs.getString("apellido1"));
                SS1_Usuario.setApellido2(rs.getString("apellido2"));
                lista.add(SS1_Usuario);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return lista;
    }

    public List<SS3_InformeEventosAsistente> dameResultEventosAsistente(SS1_Usuario asistente, SS1_TipoEvento tipoEvento,
            String fechaInicial, String fechaFinal, KeyValue estadoEvento)
            throws RemoteException, Exception {

        List<SS3_InformeEventosAsistente> lista = new ArrayList<SS3_InformeEventosAsistente>();
        ResultSet rs = null;
        System.out.println("Conecto con BD y extraigo la query: " + tipoEvento.getId());
        try {
            conectaBD();
            String assitantNull = asistente.getCodigo() == null ? "" : ("AND usuario.cod_usuario = " + asistente.getCodigo());
            String eventTypeNull = tipoEvento.getId() == -1 ? "" : ("AND evento.cod_tipoevento = " + tipoEvento.getId());
            String fechaInicialNull = fechaInicial.equalsIgnoreCase("") ? "" : ("AND evento.fecha_celebracion >= '" + fechaInicial) + "' ";
            String fechaFinalNull = fechaFinal.equalsIgnoreCase("") ? "" : ("AND evento.fecha_celebracion <= '" + fechaFinal + "' ");
            String estadoEventoNull = estadoEvento.getKey() == null ? "" : ("AND evento.activo = '" + estadoEvento.getKey() + "' ");
            ;
            String query = "SELECT universidad.nombre as nombreUniversidad, centrodocente.nombre as nombreCentro"
                    + ",evento.nombre as nombreEvento, "
                    + "tipoevento.titulo, evento.fecha_celebracion, evento.duracion, evento.activo,"
                    + " inscripcion.checkin "
                    + "FROM public.universidad, public.usuario, public.inscripcion, "
                    + "public.evento, public.centrodocente, public.tipoevento "
                    + "WHERE universidad.cod_universidad = centrodocente.cod_universidad "
                    + "AND usuario.cod_usuario = inscripcion.cod_usuario "
                    + "AND evento.cod_evento = inscripcion.cod_evento "
                    + "AND centrodocente.cod_centrodocente = evento.cod_centrodocente "
                    + "AND tipoevento.cod_tipoevento = evento.cod_tipoevento "
                    + assitantNull + " "
                    + eventTypeNull + " "
                    + fechaInicialNull + " "
                    + fechaFinalNull + " "
                    + estadoEventoNull + " ";
            System.out.println(query);

            rs = selectQuery(query);
            while (rs.next()) {
                SS3_InformeEventosAsistente sS3_InformeEventosAsistente = new SS3_InformeEventosAsistente();
                sS3_InformeEventosAsistente.setUniversidad(rs.getString("nombreUniversidad"));
                sS3_InformeEventosAsistente.setCentro(rs.getString("nombreCentro"));
                sS3_InformeEventosAsistente.setEvento(rs.getString("nombreEvento"));
                sS3_InformeEventosAsistente.setTipoEvento(rs.getString("titulo"));
                sS3_InformeEventosAsistente.setFechaInicio(rs.getDate("fecha_celebracion"));
                sS3_InformeEventosAsistente.setDuracion(rs.getString("duracion"));
                sS3_InformeEventosAsistente.setCerrado(rs.getString("activo"));
                sS3_InformeEventosAsistente.setEstadoAsistente(rs.getBoolean("checkin"));
                lista.add(sS3_InformeEventosAsistente);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return lista;
    }

    public List<SS3_InformeEventosAsistente> dameResultPorcentajeAsistencia(SS1_Universidad universidad, SS1_CentroDocente centro,
            SS1_TipoEvento tipoEvento, String fechaInicial, String fechaFinal, String porcentajeMayor,
            String porcentajeMenor) throws RemoteException, Exception {
        List<SS3_InformeEventosAsistente> lista = new ArrayList<SS3_InformeEventosAsistente>();
        ResultSet rs = null;
        try {
            conectaBD();
            System.out.println("FECHA INICIAL!!!: " + fechaInicial);
            String universityNull = universidad.getId() == -1 ? "" : ("AND universidad.cod_universidad = " + universidad.getId());
            String centerNull = centro.getId() == -1 ? "" : ("AND centrodocente.cod_centrodocente = " + centro.getId());
            String eventTypeNull = tipoEvento.getId() == -1 ? "" : ("AND evento.cod_tipoevento = " + tipoEvento.getId());
            String fechaInicialNull = fechaInicial.equalsIgnoreCase("") ? "" : ("AND evento.fecha_celebracion >= '" + fechaInicial) + "' ";
            String fechaFinalNull = fechaFinal.equalsIgnoreCase("") ? "" : ("AND evento.fecha_celebracion <= '" + fechaFinal + "' ");
             ;
            String query = "SELECT inscripcion.checkin, evento.nombre as nombreEvento, universidad.nombre as nombreUniversidad, "
                    + "centrodocente.nombre as nombreCentro, tipoevento.titulo, evento.fecha_celebracion, "
                    + "evento.plazas "
                    + "FROM public.universidad, public.centrodocente, "
                    + "public.tipoevento, public.inscripcion, public.evento "
                    + "WHERE centrodocente.cod_universidad = universidad.cod_universidad "
                    + "AND centrodocente.cod_centrodocente = evento.cod_centrodocente "
                    + "AND tipoevento.cod_tipoevento = evento.cod_tipoevento "
                    + "AND evento.cod_evento = inscripcion.cod_evento "
                    + "AND evento.activo = '0' "
                    + universityNull + " "
                    + centerNull + " "
                    + eventTypeNull + " "
                    + fechaInicialNull + " "
                    + fechaFinalNull + " ";
            ;
            System.out.println(query);
            rs = selectQuery(query);
            while (rs.next()) {
                SS3_InformeEventosAsistente sS3_InformeEventosAsistente = new SS3_InformeEventosAsistente();
                sS3_InformeEventosAsistente.setUniversidad(rs.getString("nombreUniversidad"));
                sS3_InformeEventosAsistente.setCentro(rs.getString("nombreCentro"));
                sS3_InformeEventosAsistente.setEvento(rs.getString("nombreEvento"));
                sS3_InformeEventosAsistente.setTipoEvento(rs.getString("titulo"));
                sS3_InformeEventosAsistente.setFechaInicio(rs.getDate("fecha_celebracion"));
                sS3_InformeEventosAsistente.setPlazas(rs.getInt("plazas"));
                sS3_InformeEventosAsistente.setAsistencia(rs.getBoolean("checkin"));
                lista.add(sS3_InformeEventosAsistente);

            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return lista;
    }

    /**
     *
     * @return
     * @throws RemoteException
     * @throws SQLException
     */
    public List<String> getComboUsuarios() throws RemoteException, SQLException {
        List<String> paises = new ArrayList<String>();
        try {
            conectaBD();
            ResultSet rs = select("usuario");
            while (rs.next()) {

                paises.add(rs.getString("nombre"));
            }
            rs.close();
            desconectaBD();
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } catch (Exception e) {
            ExceptionUtils.visualizarError(e.getMessage());
        }
        return paises;
    }

    public List<SS2_Evento> getComboEventos() throws RemoteException, Exception {
        List<SS2_Evento> llista = new ArrayList<SS2_Evento>();
        ResultSet rs = null;
        try {
            conectaBD();
            rs = select("evento");
            while (rs.next()) {
                SS2_Evento sS2_Evento = new SS2_Evento();
                sS2_Evento.setidEvento(rs.getInt("cod_evento"));
                sS2_Evento.setNombre(rs.getString("nombre"));
                llista.add(sS2_Evento);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } catch (Exception e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return llista;
    }

    public List<SS3_InformeEventosAsistente> dameResultAsistentesEvento(SS1_Universidad sS1_Universidad, SS1_CentroDocente sS1_CentroDocente, SS2_Evento sS2_Evento, KeyValue asistencia) throws RemoteException, Exception {

        List<SS3_InformeEventosAsistente> lista = new ArrayList<SS3_InformeEventosAsistente>();
        ResultSet rs = null;
        try {
            conectaBD();
            String asistenciaNull = asistencia.getKey() == null ? "" : ("AND inscripcion.checkin = '" + asistencia.getKey() + "' ");
            String eventNull = sS2_Evento.getidEvento() == -1 ? "" : ("AND evento.cod_evento = " + sS2_Evento.getidEvento());
            String centerNull = sS1_CentroDocente.getId() == -1 ? "" : ("AND centrodocente.cod_centrodocente = " + sS1_CentroDocente.getId());
            String universityNull = sS1_Universidad.getId() == -1 ? "" : ("AND universidad.cod_universidad = " + sS1_Universidad.getId());
            ;

            String query = "SELECT "
                    + "usuario.nombre as userName, usuario.apellido1, usuario.apellido2, usuario.rol, "
                    + "usuario.numero_documento, centrodocente.nombre centerName, inscripcion.checkin "
                    + "FROM public.inscripcion, public.usuario, public.universidad, "
                    + "public.centrodocente, public.evento "
                    + "WHERE inscripcion.cod_usuario = usuario.cod_usuario "
                    + "AND inscripcion.cod_evento = evento.cod_evento "
                    + "AND universidad.cod_universidad = centrodocente.cod_universidad "
                    + "AND evento.cod_centrodocente=centrodocente.cod_centrodocente "
                    + asistenciaNull + " "
                    + eventNull + " "
                    + centerNull + " "
                    + universityNull + " ";
            System.out.println(query);
            rs = selectQuery(query);
            while (rs.next()) {
                SS3_InformeEventosAsistente sS3_InformeEventosAsistente = new SS3_InformeEventosAsistente();
                sS3_InformeEventosAsistente.setNombreUsuario(rs.getString("userName"));
                sS3_InformeEventosAsistente.setApellido1(rs.getString("apellido1"));
                sS3_InformeEventosAsistente.setApellido2(rs.getString("apellido2"));
                sS3_InformeEventosAsistente.setRol(rs.getInt("rol"));
                sS3_InformeEventosAsistente.setdNI(rs.getString("numero_documento"));
                sS3_InformeEventosAsistente.setCentro(rs.getString("centerName"));
                sS3_InformeEventosAsistente.setAsistencia(rs.getBoolean("checkin"));
                lista.add(sS3_InformeEventosAsistente);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return lista;
    }

    public List<SS3_InformeEventosAsistente> dameResultIngresosTotales(SS1_Universidad sS1_Universidad,
            SS1_CentroDocente sS1_CentroDocente, SS1_TipoEvento tipoEvento,
            String precioMayorDe, String precioMenorDe) throws RemoteException, Exception {
        List<SS3_InformeEventosAsistente> lista = new ArrayList<SS3_InformeEventosAsistente>();
        ResultSet rs = null;
        try {
            conectaBD();
            String eventTypeNull = tipoEvento.getId() == -1 ? "" : ("AND evento.cod_tipoevento = '" + tipoEvento.getId() + "' ");
            String centerNull = sS1_CentroDocente.getId() == -1 ? "" : ("AND centrodocente.cod_centrodocente = " + sS1_CentroDocente.getId());
            String universityNull = sS1_Universidad.getId() == -1 ? "" : ("AND universidad.cod_universidad = " + sS1_Universidad.getId());
            String precioMayorDeNull = precioMayorDe.equalsIgnoreCase("") ? "" : ("AND evento.precio > '" + precioMayorDe + "' ");
            String precioMenorDeNull = precioMenorDe.equalsIgnoreCase("") ? "" : ("AND evento.precio < '" + precioMenorDe + "' ");
            ;
            String query = "SELECT evento.precio, universidad.nombre as universitiName, centrodocente.nombre as centerName, "
                    + "tipoevento.titulo ,evento.nombre as eventName "
                    + "FROM public.universidad, public.centrodocente, public.tipoevento, "
                    + "public.evento, public.inscripcion "
                    + "WHERE centrodocente.cod_centrodocente = universidad.cod_universidad "
                    + "AND centrodocente.cod_centrodocente =evento.cod_centrodocente "
                    + "AND tipoevento.cod_tipoevento = evento.cod_tipoevento "
                    + "AND inscripcion.cod_evento = evento.cod_evento "
                    + eventTypeNull + " "
                    + centerNull + " "
                    + universityNull + " "
                    + precioMayorDeNull + " "
                    + precioMenorDeNull + " "
                    + "ORDER BY eventName ASC";
            System.out.println(query);
            rs = selectQuery(query);
            while (rs.next()) {
                SS3_InformeEventosAsistente sS3_InformeEventosAsistente = new SS3_InformeEventosAsistente();
                sS3_InformeEventosAsistente.setUniversidad(rs.getString("universitiName"));
                sS3_InformeEventosAsistente.setCentro(rs.getString("centerName"));
                sS3_InformeEventosAsistente.setTipoEvento(rs.getString("titulo"));
                sS3_InformeEventosAsistente.setEvento(rs.getString("eventName"));
                sS3_InformeEventosAsistente.setPrecio(rs.getInt("precio"));
                lista.add(sS3_InformeEventosAsistente);
            }
        } catch (SQLException e) {
            ExceptionUtils.visualizarError(e.getMessage());
        } finally {
            try {
                rs.close();
                desconectaBD();
            } catch (Exception e) {
                ExceptionUtils.visualizarError(e.getMessage());
            }
        }
        return lista;
    }

    public List<SS1_CentroDocente> dameCentrosUniversidad(SS1_Universidad sS1_Universidad) throws RemoteException, Exception {
        List<SS1_CentroDocente> centros = new ArrayList<SS1_CentroDocente>();
        try {
            conectaBD();
            if (sS1_Universidad.getId() != -1) {
                ResultSet rs = select("CENTRODOCENTE", "cod_Universidad = " + sS1_Universidad.getId() + "");
                while (rs.next()) {
                    SS1_CentroDocente centro = new SS1_CentroDocente();
                    centro.setId(rs.getInt("cod_CentroDocente"));
                    centro.setNombre(rs.getString("nombre"));
                    centros.add(centro);
                }
                rs.close();
                desconectaBD();
            } else {
                centros = getComboCentroDocente();
            }
        } catch (SQLException e) {
//            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        } catch (Exception e) {
            ExceptionUtils.visualizarError(e.getMessage());
        }
        return centros;
    }
}
